/**
 * 给一个二维地图，在空地上可以放2个H，然后曼哈顿距离不超过的位置都变成H
 * 问如何放置可以使得H最多。
 * 注意到规模极小，枚举即可。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using Real = long double;
using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

int H, W, D;
vector<string> Board;

map<pii, set<pii>> Map;

void proc(int r, int c){
    auto it = Map.find({r, c});
    assert(it == Map.end());
    it = Map.insert(it, {{r, c}, {}});
    auto & ss = it->second;

    for(int i=0;i<H;++i)for(int j=0;j<W;++j){
        if('#' == Board[i][j]) continue;
        if(abs(i - r) + abs(j - c) > D) continue;

        ss.insert({i, j});
    }
}

void work(){
    cin >> H >> W >> D;
    Board.assign(H, {});
    for(auto & s : Board) cin >> s;

    for(int i=0;i<H;++i)for(int j=0;j<W;++j){
        if('#' == Board[i][j]) continue;

        proc(i, j);
    }

    int ans = 0;
    for(int i=0;i<H;++i)for(int j=0;j<W;++j){
        if('#' == Board[i][j]) continue;
        const auto & as = Map[{i, j}];
        for(int x=0;x<H;++x)for(int y=0;y<W;++y){
            if('#' == Board[x][y]) continue;
            
            const auto & bs = Map[{x, y}];
            int tmp = as.size();
            for(const auto & c : bs){
                if(as.find(c) == as.end()){
                    tmp += 1;
                }
            }
            ans = max(ans, tmp);

        }
    }
    cout << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	

    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}